package com.example.jianbing.juc;

import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : Lock8
 * @Description :
 * @Author : JB
 * @Date: 2020-08-04 22:54
 */

class Phone{
    public synchronized void seadEmail() throws  Exception{
        TimeUnit.SECONDS.sleep(4);
        System.out.println("-----send Email");
    }
    public synchronized void seadSMS() throws  Exception{
        System.out.println("-----send SMS");
    }
}
/***
 *
 * 题目： 多线程8锁
 * 1. 标准访问，请问先打印邮件还是短信？
 * 2. 邮件方法暂停4秒，请问先打印邮件还是短信？
 * 3. 新增一个hello（）方法，请问先打印邮件还是hello
 * 4. 两部手机，请问先打印邮件还是短信？
 * 5. 两个静态同步方法，同一部手机，请问先打印邮件还是短信？
 * 6. 两个静态同步方法，2部手机，请问先打印邮件还是短信？
 * 7. 1个普通同步方法，1个静态同步方法，1部手机，请问先打印邮件还是短信？
 * 8. 1个普通同步方法，1个静态同步方法，2部手机，请问先打印邮件还是短信？
 *
 * 笔记：
 *      一个对象里面如果有多个synchronized方法，某一个时刻内，只要一个线程去调用其中的一个synchronized方法了
 *      其他的线程都只能等待，换句话说，某一个时刻，只能有唯一一个线程去访问这些synchronized方法
 *      锁的是当前对象this,被锁定后,其他线程都不能进入到当前对象的其他synchronized方法
 *
 *      synchronized实现同步的基础：Java中的每一个对象都可以作为锁
 *      具体表现为以下3种形式
 *      对于普通同步方法，锁的是当前实例对象
 *      对于静态同步方法，锁的是当前类的class对象
 *      对于同步方法块，锁的是Synchronized括号里配置的对象
 *
 *      当一个对象试图访问同步方法块，它首先必须得到锁，退出或者抛出异常时必须释放锁
 *
 *
 */
public class Lock8 {
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        new Thread(()->{
            try {
                phone.seadEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"A").start();
        new Thread(()->{
            try {
                phone.seadSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"B").start();
    }
}
